import 'package:flutter/material.dart';

class LeetCode extends StatefulWidget {
  @override
  _LeetCodeState createState() => _LeetCodeState();
}

class _LeetCodeState extends State<LeetCode>
    with SingleTickerProviderStateMixin {
  AnimationController _controller;

  @override
  void initState() {
    super.initState();
    _controller = AnimationController(vsync: this);
    // print('最终是:\n');
    // print(
      reverList([1, 2, 3, 4, 5])
      // )
      ;
  }

  @override
  void dispose() {
    super.dispose();
    _controller.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("leetcode"),
      ),
      body: Row(
        children: [
          Expanded(
            child: ListView(
              shrinkWrap: true,
              children: [
                MaterialButton(
                  color: Colors.blue,
                  textColor: Colors.white,
                  child: new Text('单词规律'),
                  onPressed: () {
                    print(isSolution('12213', 'cat dog dog cat bird'));
                  },
                ),
              ],
            ),
          ),
          Expanded(
            child: ListView(
              shrinkWrap: true,
              children: [
                MaterialButton(
                  color: Colors.blue,
                  textColor: Colors.white,
                  child: new Text('两数之和'),
                  onPressed: () {
                    print(twoSum([1, 3, 9, 10], 13));
                  },
                ),
              ],
            ),
          ),
          Expanded(
            child: ListView(
              shrinkWrap: true,
              children: [
                MaterialButton(
                  color: Colors.blue,
                  textColor: Colors.white,
                  child: new Text('两数之和'),
                  onPressed: () {
                    addTwoNumbers([2, 4, 3], [5, 6, 4]);
                  },
                ),
              ],
            ),
          )
        ],
      ),
    );
  }

  /*
    给定一种规律 pattern 和一个字符串 str ，判断 str 是否遵循相同的规律。

    这里的 遵循 指完全匹配，例如， pattern 里的每个字母和字符串 str 中的每个非空单词之间存在着双向连接的对应规律。

    示例1:

    输入: pattern = "abba", str = "dog cat cat dog"
    输出: true
    示例 2:

    输入:pattern = "abba", str = "dog cat cat fish"
    输出: false
    示例 3:

    输入: pattern = "aaaa", str = "dog cat cat dog"
    输出: false
    示例 4:

    输入: pattern = "abba", str = "dog dog dog dog"
    输出: false
    说明:
    你可以假设 pattern 只包含小写字母， str 包含了由单个空格分隔的小写字母。    

    来源：力扣（LeetCode）
    链接：https://leetcode-cn.com/problems/word-pattern
    著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
  */
  bool isSolution(String pattern, String s) {
    List sl = s.split(' ');
    if (pattern.length != sl.length) {
      return false;
    }

    Map map = Map();
    for (var i = 0; i < pattern.length; i++) {
      String tmp = pattern[i];
      //key已经在
      if (map.containsKey(tmp)) {
        //不对应就失败
        if (map[tmp] != sl[i]) return false;
      }
      //key不存在
      else {
        //两个value的值一样 a-dog b-dog  ->false
        if (map.containsValue(sl[i])) {
          return false;
        } else {
          //添加k-v值
          map.putIfAbsent(tmp, () => sl[i]);
        }
      }
    }
    return true;
  }

/*
  给定一个整数数组 nums 和一个目标值 target，请你在该数组中找出和为目标值的那 两个 整数，并返回他们的数组下标。

  你可以假设每种输入只会对应一个答案。但是，数组中同一个元素不能使用两遍。

   

  示例:

  给定 nums = [2, 7, 11, 15], target = 9

  因为 nums[0] + nums[1] = 2 + 7 = 9
  所以返回 [0, 1]

  来源：力扣（LeetCode）
  链接：https://leetcode-cn.com/problems/two-sum
  著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
*/
  List twoSum(List<int> nums, int targer) {
    List list = [];
    Map map = Map();
    if (nums.length < 2) {
      return list;
    } else {
      for (var i = 0; i < nums.length; i++) {
        if (map.containsKey(nums[i])) {
          list.addAll([map[nums[i]], i]);
          return list;
        }
        map.putIfAbsent(targer - nums[i], () => i);
      }
    }
    return list;
  }

  /*
   给出两个 非空 的链表用来表示两个非负的整数。其中，它们各自的位数是按照 逆序 的方式存储的，并且它们的每个节点只能存储 一位 数字。

    如果，我们将这两个数相加起来，则会返回一个新的链表来表示它们的和。

    您可以假设除了数字 0 之外，这两个数都不会以 0 开头。

    示例：

    输入：(2 -> 4 -> 3) + (5 -> 6 -> 4)
    输出：7 -> 0 -> 8
    原因：342 + 465 = 807

    来源：力扣（LeetCode）
    链接：https://leetcode-cn.com/problems/add-two-numbers
    著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
  */

  void addTwoNumbers(List l1, List l2) {
    List root = List();
    List cursor = root;
    int carry = 0;
    while (l1 != null || l2 != null || carry != 0) {
      int l1Val = l1 != null ? l1.cast() : 0;
      int l2Val = l1 != null ? l2.cast() : 0;
      int sumVal = l1Val + l2Val + carry;
      carry = (sumVal / 10).ceil();
      List sumNode = List(sumVal % 10);
      // cursor->next
    }
  }

  List reverList(List head) {
    if (head.length == 0) return head;
    int num = head[0];
    head.removeAt(0);
    List newHead = reverList(head);
    head.insert((head.length), num);
    print(newHead);
    return newHead;
  }
}
